package com.gxa.config;


import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

//@Configuration
public class RabbitConfig {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }

    @PostConstruct
    public void init(){

        //该回调，是消息是否到达交换机的回调方法 ，前提是要设置spring.rabbitmq.publisher-confirm-type=correlated
        this.rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            /*
            correlationData:
            b: boolean true:成功到达交换机 ，失败的原因就为null false未达到交换机
            s:失败的原因
             */
            @Override
            public void confirm(CorrelationData correlationData, boolean b, String s) {
                //能收到哪个消息失败了，又可以根据该id从数据库捞出来
//                System.out.println("------correlationData------->" + correlationData.getId());
                System.out.println("------是否到达换机------->" + b);
                System.out.println("------内容------->" + s);
                if(!b){//消息没有到达交换机
                    //记录日志  ，记录错误原因 ，也要记录是哪条消息失败 可以进行人工补偿
                    //再次发送

                }

            }
        });

        /**
         *
         #开启broker收到消息后将消息投递到queue的回调
         spring.rabbitmq.publisher-returns=true
         #只要消息抵达queue，以异步方式优先回调returnconfirm
         spring.rabbitmq.template.mandatory=true

         *  消息 从交换机到 队列的回调 ,只有消息没有通过交换机送到queue才回调 失败了才回调
         */

        this.rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {
            @Override
            public void returnedMessage(ReturnedMessage returnedMessage) {
                Message message = returnedMessage.getMessage();

                String exchange = returnedMessage.getExchange();
                String routingKey = returnedMessage.getRoutingKey();
                System.out.println("================================>" +exchange + "====" +routingKey  + "==="+ message);

                //记录日志(记录在数据库中)，重新投递消息 ，重复消息(业务幂等)

            }
        });

    }
}
